package com.rustic.server.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.rustic.server.enums.LinkType;
import com.rustic.server.po.UserBrowseLink;
import com.rustic.server.query.UserBrowseLinkAdminListQuery;
import com.rustic.server.vo.list.UserBrowseLinkAdminListVO;
import com.rustic.server.vo.list.UserBrowseLinkWebListVO;

import java.util.List;
import java.util.Map;

/**
 * 表[user_browse_link]对应的服务类
 *
 * @author auto
 */

public interface UserBrowseLinkService extends IService<UserBrowseLink> {

    String USER_BROWSE_LINK_NOT_EXIST = "用户浏览关联不存在";

    /**
     * 查询（根据ID 批量查询）
     *
     * @param idList id列表
     * @return 用户浏览关联列表
     */
    List<UserBrowseLink> listByIdIn(List<Integer> idList);

    /**
     * 查询（根据ID 批量查询）并转换成Map
     *
     * @param idList id列表
     * @return 用户浏览关联列表
     */
    Map<Integer, UserBrowseLink> mapByIdIn(List<Integer> idList);

    /**
     * 管理列表查询条件
     *
     * @param query 查询参数
     * @return 查询条件
     */
    LambdaQueryWrapper<UserBrowseLink> toAdminListWrapper(UserBrowseLinkAdminListQuery query);

    /**
     * toAdminListVo
     *
     * @param userBrowseLinkList userBrowseLinkList
     * @return AdminListVO
     */
    List<UserBrowseLinkAdminListVO> toAdminListVo(List<UserBrowseLink> userBrowseLinkList);

    /**
     * toWebListVo
     *
     * @param userBrowseLinkList userBrowseLinkList
     * @return WebListVo
     */
    List<UserBrowseLinkWebListVO> toWebListVo(List<UserBrowseLink> userBrowseLinkList);

    /**
     * 根据目标id列表和目标类型进行查询，并统计对应目标的浏览数据数量
     *
     * @param targetIdList 目标id列表
     * @param type         目标类型
     * @return Map<Integer, Long> 统计对应目标的数据数量
     */
    Map<Integer, Long> mapByTargetIdAndType(List<Integer> targetIdList, LinkType type);

    /**
     * 根据目标id和目标类型查询浏览数量
     *
     * @param targetId 目标id
     * @param type     类型
     * @return 浏览数量
     */
    Long getByTargetAndType(int targetId, LinkType type);

    /**
     * 添加浏览记录
     *
     * @param userId   用户id
     * @param targetId 目标id
     * @param type     类型
     */
    void addBrowse(int userId, int targetId, int type);

    /**
     * 根据用户id、目标id和类型查询用户是否有浏览
     *
     * @param userId   用户id
     * @param targetId 目标id
     * @param type     类型
     * @return UserBrowseLink
     */
    UserBrowseLink getByUserTargetAndType(int userId, int targetId, int type);
}
